查看原文
其他

新手如何使用STM32两个月内做出自己的空心杯小四轴(4)

西安-小马哥 电子开发学习 2021-01-31

(接上一篇)


        前面说到那个板子问题很多,那就只好自己画了,把前面提到的原理图中所有错误都修改了。修改之后的电路图如下:





        但是同时,也考虑到这个板子的形状有问题。四轴的原理是靠四个空心杯带动桨叶,桨叶转动的时候把风往下排,同时也就给自己一个向上的反冲力。而这个四轴板子,大家可以再次看看:

        它的问题在哪儿呢?

        安装电机的位置的圆盘太大了,导致桨叶把风排下来之后都撞击在这个圆盘上了,这就相当于对自己在做工。好比你抱着自己的腿想把自己抱起来,但是那是不可能的,因为你做的功都是对一个系统做功,而不是在克服地球引力做功。

        所以需要将这个圆盘的尺寸减小。

        同时,考虑到720空心杯带动55mm的桨叶,可能四个桨叶同时转动,并不能提供太大的升力,而我想要做一个比较暴力的四轴,那就需要使用稍微大点的桨叶,这里我选择了75mm的桨叶。

        75mm桨叶的一半是37.5mm,那么两个电机的距离就应该是2*37.5mm+余量,这个余量就是桨叶转起来的时候所形成的圆面的边缘的距离,如果没有这个距离显然两个桨叶可能会撞击,所以我选择了留10mm的余量。那么最终确定下来两个电机的轴心距就是85mm。

        根据上面的原理图和对板子形状的构思,布局出来的板子如下:


         有人问我这个板子形状怎么画的,有两种画法:
         1、直接使用AD,在板子的KEEPOUT LAYER 绘制板子形状,然后选中画好的板子外形的线,点【设计】--【板子形状】--【按照选择对象定义】。就可以做成上面这样的图。里面要注意的细节是,线条之间要平滑过渡,整个外形要由一笔画成。
         2、使用CAD绘制板子外形轮廓,然后导入到AD的pcb文件中,之后选中画好的板子外形的线,点【设计】--【板子形状】--【按照选择对象定义】。也可以生成对应的图。里面要注意的细节是导入的时候要选择好尺寸对应关系。

         两种方法各有优劣。如果平时不用CAD,而且也不想为了一个板子外形就安装一个CAD的话,那就直接使用AD去画。只不过AD里面提供的画图软件并没有那么好用,尤其是绘制直线和圆平滑过渡的地方。如果没有很好的尺规作图的功底的话。操作起来很困难。如果自己懂一点CAD或者想借机学习一下CAD绘图,那就可以使用CAD去画这个板子的外形,优点是做图及其方便,大概十分钟就可以绘制好这个板子的外形, 而且是不用左手键的前提,如果用左手键,可能几分钟就画好了。

         布好线之后检查无误就可以出加工文件送PCB厂加工制作了。整个操作过程有时间会在摩尔吧开一个直播来和大家共同讨论学习。目前我所有的课程与视频如下:

1、18G四轴散件焊接调试视频百度云链接: 密码:unx2
2、3G手柄散件焊接调试教程百度云链接: 密码:68vh
3、四轴相关技术讨论QQ群1:419203944,群2:604047647,群3:560572155
4、美拍四轴焊接直播id:1097057461
5、四轴PCB板及成品官方唯一淘宝店地址:
6、STM32四轴课程系列直播-第一讲(原理图讲解):
7、STM32四轴课程系列直播-第二讲(四轴软件知识体系梳理):
8、STM32四轴课程系列直播-第三讲(软件入门一):
9、STM32四轴课程系列直播-第四讲(软件入门二):
10、STM32四轴课程系列直播-第五讲(软件入门三):
11、STM32四轴课程系列直播-第六讲(软件进阶一I2C协议,数据通讯时序讲解):
12、STM32四轴课程系列直播-第七讲(软件进阶二I2C协议软件实现):
13、STM32四轴课程系列直播-第八讲(中断系统):
14、STM32四轴课程系列直播-第九讲(MPU6050原理讲解):
15、STM32四轴课程系列直播-第十讲(MPU6050原始数据获取):
16、STM32四轴课程系列直播-第十一讲(MPU6050 官方DMP库的移植):
17、STM32四轴课程系列直播-第十二讲(MPU6050获取姿态角的代码实现):
18、STM32四轴课程系列直播-第十三讲(MPU6050姿态角的使用):


         交付打样之后就需要等了。

         大概过了一个世纪,自己的板子终于回来了。

         撸起袖子就焊接,整个焊接好了,然后上电池,漂亮,电源指示灯亮了。

         然后简单的写了点灯的代码来点LED灯:

  1. void LED_Init(void)

  2. {

  3.         GPIO_InitTypeDef GPIO_InitStruct;

  4.         

  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  6.         

  7.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;

  8.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

  9.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

  10.         GPIO_Init(GPIOA, &GPIO_InitStruct);

  11.         

  12.         GPIO_SetBits(GPIOA, GPIO_Pin_1);

  13. }

复制代码

  1. <blockquote>#include "led.h"

复制代码

    
        也没有问题,灯按照1S闪烁1次的频率在闪烁。

       那就驱动电机呗:

  1. //电机驱动定时器

  2. void TIM1_Config(void){

  3.         

  4.         TIM_TimeBaseInitTypeDef TIM_timeBaseInitStructure;

  5.         TIM_OCInitTypeDef TIM_OCInitStructure;

  6.         GPIO_InitTypeDef GPIO_InitStruct;


  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  9.         

  10.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;

  11.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

  12.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

  13.         GPIO_Init(GPIOA,&GPIO_InitStruct);

  14.         


  15.         TIM_timeBaseInitStructure.TIM_ClockDivision = 0;

  16.         TIM_timeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

  17.         TIM_timeBaseInitStructure.TIM_Period = SystemCoreClock/36000-1;

  18.         TIM_timeBaseInitStructure.TIM_Prescaler = 0;

  19.         TIM_timeBaseInitStructure.TIM_RepetitionCounter = 0;

  20.         TIM_TimeBaseInit(TIM1,&TIM_timeBaseInitStructure);

  21.         


  22.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

  23.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  24.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  25.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

  26.         TIM_OCInitStructure.TIM_Pulse = pulse;

  27.         TIM_OC1Init(TIM1,&TIM_OCInitStructure);

  28.         TIM_OC2Init(TIM1,&TIM_OCInitStructure);

  29.         TIM_OC3Init(TIM1,&TIM_OCInitStructure);

  30.         TIM_OC4Init(TIM1,&TIM_OCInitStructure);



  31.         TIM_ARRPreloadConfig(TIM1,ENABLE);

  32.         

  33.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);

  34.         TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);

  35.         TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);

  36.         TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);

  37.         

  38.         TIM_Cmd(TIM1,ENABLE);

  39.         TIM_CtrlPWMOutputs(TIM1,ENABLE);

  40.         

  41. }

复制代码

  1. #include "tim.h"


  2. volatile u16 pulse;


  3. int main()

  4. {

  5.              u8 i;

  6.              pulse = 0;

  7.              TIM1_Config();

  8.              for(i=0;i<170;i++)

  9.              {

  10.                           pulse+=10;


复制代码


        这一测试完犊子了,什么情况呢,电机没转吗?

        不是,电机也转起来了,但是电机转起来大概三四秒,刚刚速度比较快了就会停下,然后又重新开始转,就这样周而复始。

        但是很明显程序不是这样写的啊,究竟是出什么问题了?电池都是刚刚充满电的啊,大概有4.2V左右。点灯的时候也没看出有啥问题啊,所以单片机应该是没问题的啊。

        这个问题真是把我困扰了,于是我开始苦苦思索。。大家也开动自己聪明的小脑瓜想想这是什么原因吧。当然我群里的人大概都知道是什么情况导致的,因为我曾今不止一次在群里说过这个问题。

        这个蹊跷的事情,我们下次更新的时候继续探索。希望在更新前能看到大家的答案。

  

        想看大家在STM32社区盖楼讨论,请点击左下角阅读原文,或者直接电脑浏览器搜索打开STM32社区即可看到。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存